home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1994 #2
/
Monster Media No. 2 (Monster Media)(1994).ISO
/
database
/
bltw110.zip
/
BW_LAI11.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-18
|
10KB
|
330 lines
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "BULLET.h"
#pragma pack(1) /* C7 packs to EVEN by default
Must pack any Bullet-used data
structures to standard byte-
alignment with any compiler!
YOUR PROGRAM WILL NOT RUN CORRECTLY
UNLESS THIS IS SO!
*/
/*
12-Jul-94
BW_LAI11.C -chh
The RC resource compiler may generate a warning about the use of
hard-code data segment loads with the DGROUP value. The warning is
relevant to a multi-instanced program, which Bullet code won't be
(can't be). Future versions will remove this limitation (i.e., a
DLL version will be available).
18-Mar-94
BW_LAI11.C -chh
Minor modifications from the previous BC_LAI10.C (a little understanding
helps) but essentially done for the Bullet Windows (QuickWin of C7)
test program. Running from Windows Standard Mode fails because Windows
does not properly handle INT21/65xx calls. In order to run from Standard
Mode you must either supply your own collate table (demonstrated below),
or use a straight ASCII sort. Windows does handle INT21/65xx from Enhanced
Mode correctly.
*/
/* Country code 001 collate table from US MS-DOS 6.20 */
unsigned char cc001[256] =
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x7B,0x7C,0x7D,0x7E,0x7F,
0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41,
0x45,0x41,0x41,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x24,0x24,0x24,0x24,0x24,
0x41,0x49,0x4F,0x55,0x4E,0x4E,0xA6,0xA7,0x3F,0xA9,0xAA,0xAB,0xAC,0x21,0x22,0x22,
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
0xE0,0x53,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF
};
/* --test raw speed using 32-bit long integer key, unique
1) this test uses a non-standard binary field as a sort field
2) this code is for raw speed tests--it's straight inline
Note: memory model must be medium, large, or huge */
struct memorypack MP;
struct initpack IP;
struct exitpack EP;
struct fielddesctype fieldlist[2];
struct createdatapack CDP;
struct createkeypack CKP;
struct dosfilepack DFP;
struct openpack OP;
struct accesspack AP;
struct exitpack EP;
int rez, level, ccflag;
div_t div_rez;
time_t starttime, endtime;
char tmpstr[129];
char NameDAT[] = ".\\BINTEST.DBB";
char NameIX1[] = ".\\BINTEST.IX1";
char kx1[] = "CODENUMBER";
unsigned handdat, handix1;
struct testrectype {
char tag;
long codenumber;
char codename[11];
}; /* test program record length=16 bytes */
struct testrectype testrec;
char keybuffer[64]; /* MUST supply a work buffer for keys */
/* a single one can be shared unless you */
/* want to preserve the key buffer for each */
/* access pack */
long recs2add;
long low;
long high;
long i;
#pragma pack()
int main()
{
strcpy(fieldlist[0].fieldname, "CODENUMBER");
strcpy(fieldlist[0].fieldtype, "B");
fieldlist[0].fieldlen = 4;
fieldlist[0].fielddc = 0;
strcpy(fieldlist[1].fieldname, "CODENAME");
strcpy(fieldlist[1].fieldtype, "C");
fieldlist[1].fieldlen = 11;
fieldlist[1].fielddc = 0;
/* excuses, excuses */
printf("BC_LAI11.C - LONG INT, SIGNED, UNIQUE long int, add/reindex speed test\n");
printf("--uses non-standard data files with binary field values, not DBF\n");
printf(">> USING DIRECTORY : .\\ \n\n");
level = 100;
MP.func = MEMORYXB;
rez = BULLET(&MP);
printf("memory avail : %lu\n",MP.memory);
if (MP.memory < 40000L) {
rez = 8;
goto Abend;
}
ccflag = 0;
printf("Override machine default collate and use embedded table? (Y/N)");
gets(tmpstr);
if (toupper(*tmpstr) == 'Y')
{
ccflag = 1;
printf("Using embedded collate table (country code=001)\n");
}
else
printf("Using machine default collate table\n");
level = 110;
IP.func = INITXB;
IP.jftmode = 0;
rez = BULLET(&IP);
if (rez != 0) goto Abend;
#if 0
level = 120;
EP.func = ATEXITXB;
rez = BULLET(&EP);
if (rez != 0) goto Abend;
#endif
level = 130; /* disregard not found errors */
DFP.func = DELETEFILEDOS;
DFP.filenameptr = NameDAT;
rez = BULLET(&DFP);
DFP.filenameptr = NameIX1;
rez = BULLET(&DFP);
level = 1000;
CDP.func = CREATEDXB;
CDP.filenameptr = NameDAT;
CDP.nofields = 2;
CDP.fieldlistptr = fieldlist;
CDP.fileid = 255;
rez = BULLET(&CDP);
if (rez !=0) goto Abend;
level = 1010;
OP.func = OPENDXB;
OP.filenameptr = NameDAT;
OP.asmode = READWRITE | DENYNONE;
rez = BULLET(&OP);
if (rez !=0) goto Abend;
handdat = OP.handle;
level = 1100;
CKP.func = CREATEKXB;
CKP.filenameptr = NameIX1;
CKP.keyexpptr = kx1;
CKP.xblink = handdat;
CKP.keyflags = cLONG | cSIGNED | cUNIQUE;
if (ccflag)
{
CKP.codepageid = 437; /* identify collate sequence -- must be */
CKP.countrycode = 1; /* non-zero else collateptr ignored */
CKP.collateptr = cc001; /* these values are specifically for */
/* the table cc001, coded above */
}
else
{
CKP.codepageid = -1; /* use this unless you specifically */
CKP.countrycode = -1; /* need to use your own collate table */
CKP.collateptr = NULL; /* as shown directly above */
}
rez = BULLET(&CKP);
if (rez !=0) goto Abend;
level = 1110;
OP.func = OPENKXB;
OP.filenameptr = NameIX1;
OP.asmode = READWRITE | DENYNONE;
OP.xblink = handdat;
rez = BULLET(&OP);
if (rez !=0) goto Abend;
handix1 = OP.handle;
AP.func = ADDRECORDXB;
AP.handle = handdat;
AP.recptr = &testrec;
AP.keyptr = keybuffer;
AP.nextptr = NULL;
testrec.tag = ' ';
strcpy(testrec.codename, "xxxSAMExxx");
printf("Recs to add/reindex: ");
gets(tmpstr);
recs2add = atol(tmpstr);
if (recs2add == 0L) recs2add = 5L;
level = 1200;
low = -3L;
high = low + recs2add - 1L;
printf("Adding %ld records ( keys %ld to %ld )... ",recs2add,low,high);
time(&starttime);
for (i = low; i < (recs2add+low); i++) {
testrec.codenumber = i;
rez = BULLET(&AP);
if (rez !=0) goto Abend;
}
time(&endtime);
printf("%lu secs.\n",(endtime - starttime));
level = 1210;
printf("Reindexing... ");
AP.func = REINDEXXB;
AP.handle = handix1;
time(&starttime);
rez = BULLET(&AP);
time(&endtime);
if (rez != 0) {
rez = AP.stat; /* MUST take AP.stat since a xaction routine */
goto Abend; /* see docs and !README2.TXT for more */
}
printf("%lu secs\n\n",(endtime - starttime));
level = 1300;
AP.func = GETFIRSTXB;
rez = BULLET(&AP);
printf(" The first 5 key/recs\n");
printf("%7lu %7ld %.10s\n",AP.recno,testrec.codenumber,testrec.codename);
for (i=1;i < 5; i++) {
if (rez != 0) break;
AP.func = GETNEXTXB;
rez = BULLET(&AP);
printf("%7lu %7ld %.10s\n",AP.recno,testrec.codenumber,testrec.codename);
}
if (rez == 202) rez = 0;
if (rez != 0) goto Abend;
puts(" ");
level = 1310;
AP.func = GETLASTXB;
rez = BULLET(&AP);
printf(" The last 5 key/recs\n");
printf("%7lu %7ld %.10s\n",AP.recno,testrec.codenumber,testrec.codename);
for (i=1;i < 5; i++) {
if (rez != 0) break;
AP.func = GETPREVXB;
rez = BULLET(&AP);
printf("%7lu %7ld %.10s\n",AP.recno,testrec.codenumber,testrec.codename);
}
if (rez == 203) rez = 0;
if (rez != 0) goto Abend;
level = 1311;
printf(" Finding the last gotten key, (in AP.keybuffer already)\n");
AP.func = GETEQUALXB;
rez = BULLET(&AP);
printf("%7lu %7ld %.10s\n",AP.recno,testrec.codenumber,testrec.codename);
if (rez != 0) goto Abend;
level = 1312;
printf(" Finding key of 5\n");
AP.func = GETEQUALXB;
*((long *)keybuffer) = 5L;
rez = BULLET(&AP);
printf("%7lu %7ld %.10s\n",AP.recno,testrec.codenumber,testrec.codename);
if (rez != 0) goto Abend;
puts("Okay.");
EP.func = EXITXB;
rez = BULLET(&EP);
return(0);
/* program exit */
/*----------------------------------------------*/
/* that's right, we go to a termination routine */
Abend:
printf("Error: %u at level %u while performing ",rez,level);
switch (level) {
case 100:
printf("a memory request of 140K.\n");
break;
default:
printf("(See source)\n"); /* just check the source */
}
exit(1);
}